package androidui.com.sj.latte.app;

import com.joanzapata.iconify.IconFontDescriptor;
import com.joanzapata.iconify.Iconify;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.WeakHashMap;

/**
 * Created by wzp on 2019/2/21 0021.
 * <p>
 * 描述  ： 进行配置文件的存储 以及获取
 */

public class Configurator {

    private static final HashMap<String, Object> LATTE_CONFIG = new HashMap<>();
    //定义一个icon存储空间
    private static final ArrayList<IconFontDescriptor> ICONS = new ArrayList<>();

    //初始化icon
    private void initIcons() {
        if (ICONS.size() > 0) {
            final Iconify.IconifyInitializer initializer = Iconify.with(ICONS.get(0));
            for (int i = 1; i < ICONS.size(); i++) {
                initializer.with(ICONS.get(i));
            }
        }
    }


    //
    private Configurator() {
        //ConfigType.CONFIG_READY.name() 枚举类的方法 字符串的形式输出

        LATTE_CONFIG.put(ConfigType.CONFIG_READY.name(), false);
    }

    /***
     * 线程安全单例模式
     *
     * 1.静态内部类
     * 2.get他
     * **/
    //获取状态信息单例
    public static Configurator getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final Configurator INSTANCE = new Configurator();

    }


    //返回配置信息 hashmap
    public static HashMap<String, Object> getLatteConfig() {
        return LATTE_CONFIG;
    }


    public final void configure() {
        //初始化图标
        initIcons();
        //初始化完成
        LATTE_CONFIG.put(ConfigType.CONFIG_READY.name(), true);
    }

    //apihost
    public final Configurator withApiHost(String host) {
        LATTE_CONFIG.put(ConfigType.API_HOST.name(), host);
        return this;
    }


    //增加自己的想要的ICON
    public final Configurator withIcon(IconFontDescriptor iconFontDescriptor) {
        ICONS.add(iconFontDescriptor);
        return this;
    }

    //檢查 配置項
    private void checkConfiguration() {
        final boolean isReady = (boolean) LATTE_CONFIG.get(ConfigType.CONFIG_READY.name());
        // 没有准备完成就抛出异常
        if (!isReady) {
            throw new RuntimeException("Configuration is not ready ,call configure");

        }
    }

    /**
     * 此注解 告诉编译器 此类型没有检测过的  并不抛出警告
     **/
    @SuppressWarnings("unchecked")
    final <T> T getConfiguration(Enum<ConfigType> key) {
        checkConfiguration();
        return (T) LATTE_CONFIG.get(key.name());
    }


}
